﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace BreukenWebsite.Models
{
    public class BreukenRepository
    {
        private BreukenDBLinqDataContext _db = new BreukenDBLinqDataContext();

        //
        // Query Methods

        public IQueryable<Opdracht> FindAllOpdrachten()
        {
            return _db.Opdrachts;
        }

        public Opdracht GetOpdracht(int id)
        {
            return _db.Opdrachts.SingleOrDefault(o => o.opdrachtID == id);
        }

        public IQueryable<OpdrachtDetail> FindAllOpdrachtDetails()
        {
            return _db.OpdrachtDetails;
        }


        public IQueryable<OpdrachtDetail> FindOpdrachtDetailByLeerlingOpdrachtDetails(int id)
        {
            var opdrachtDetails = from leerlingOpdrachtDetail in FindAllLeerlingOpdrachtDetails()
                                  where leerlingOpdrachtDetail.leerlingOpdrachtDetailID == id
                                  select leerlingOpdrachtDetail.OpdrachtDetail;
            return opdrachtDetails;

        }
        

        public IQueryable<LeerlingOpdrachtDetail> FindAllLeerlingOpdrachtenDetailsByOpdracht(int id)
        {
            var leerlingOpdrachtDets = from lod in FindAllLeerlingOpdrachtDetails()
                                       join od in FindAllOpdrachtDetails()
                                       on lod.opdrachtDetailID equals od.opdrachtDetailID
                                       where od.opdrachtID == id
                                       select lod;
            return leerlingOpdrachtDets;
        }

        public IQueryable<Opdracht> FindOpdrachtenByLeerling(String naam)
        {
            var leerling1 = from leerling in FindAllLeerlingen()
                            where leerling.naam == naam
                            select leerling;

            var opdrachten = OpdrachtenByLeerling(leerling1.Single().leerlingID);

            return opdrachten;
        }

        public IQueryable<OpdrachtDetail> FindAllOpdrachtDetailsByOpdracht(int id)
        {
            var opdrachtDetails = from opdrachtDetail in FindAllOpdrachtDetails()
                                  where opdrachtDetail.opdrachtID == id
                                  select opdrachtDetail;
            return opdrachtDetails;
        }

        public OpdrachtDetail GetOpdrachtDetail(int id)
        {
            return _db.OpdrachtDetails.SingleOrDefault(od => od.opdrachtDetailID == id);
        }

        public IQueryable<Leerling> FindAllLeerlingen()
        {
            return _db.Leerlings;
        }

        public IQueryable<Leerling> FindAllLeerlingenByOpdracht(int opdrachtID)
        {
            var leerlingen = from l in FindAllLeerlingen()
                             where (
                                from lo in FindAllLeerlingOpdrachten()
                                where lo.opdrachtID == opdrachtID
                                select lo.leerlingID
                             ).Contains(l.leerlingID)
                             select l;
            return leerlingen;
        }

        public IQueryable<Leerling> FindAllLeerlingenNotInOpdracht(int opdrachtID)
        {
            var leerlingen = from l in FindAllLeerlingen()
                             where !(
                                from lo in FindAllLeerlingOpdrachten()
                                where lo.opdrachtID == opdrachtID
                                select lo.leerlingID
                             ).Contains(l.leerlingID)
                             select l;
            return leerlingen;
        }

        public IQueryable<LeerlingOpdracht> FindAllLeerlingOpdrachten()
        {
            return _db.LeerlingOpdrachts;
        }

        public IQueryable<Opdracht> OpdrachtenByLeerling(int id)
        { 
            var opdracht = from leerlingOpdracht in FindAllLeerlingOpdrachten()
                                    where leerlingOpdracht.leerlingID == id
                                    select leerlingOpdracht.Opdracht;
            return opdracht;
        }

        public IQueryable<LeerlingOpdrachtDetail> FindAllLeerlingOpdrachtDetailsByLeerling(int id)
        {
            var leerlingOpdrachtDetails = from leerlingOpdrachtDetail in FindAllLeerlingOpdrachtDetails()
                                          where leerlingOpdrachtDetail.leerlingID == id
                                          select leerlingOpdrachtDetail;
            return leerlingOpdrachtDetails;
        }

        public IQueryable<LeerlingOpdrachtDetail> FindAllLeerlingOpdrachtDetailsByLeerlingAndOpdracht(int lid, int oid)
        {
            var leerlingOpdrachtDetails = from leerlingOpdrachtDetail in FindAllLeerlingOpdrachtDetailsByLeerling(lid)
                                          where leerlingOpdrachtDetail.OpdrachtDetail.opdrachtID==oid
                                          select leerlingOpdrachtDetail;
            return leerlingOpdrachtDetails;
        }

        public Leerling GetLeerling(int id)
        {
            return _db.Leerlings.SingleOrDefault(l => l.leerlingID == id);
        }

        public Leerling GetLeerling(String naam)
        {
            return _db.Leerlings.SingleOrDefault(l => l.naam == naam);
        }

        public LeerlingOpdracht GetLeerlingOpdracht(int id)
        {
            return _db.LeerlingOpdrachts.SingleOrDefault(l => l.leerlingOpdrachtID == id);
        }


        public IQueryable<LeerlingOpdracht> GetLeerlingOpdrachtenByLeerling(int id)
        {
            var leerlingOpdrachts = from leerlingOpdracht in FindAllLeerlingOpdrachten()
                                          where leerlingOpdracht.leerlingID == id
                                          select leerlingOpdracht;
            return leerlingOpdrachts;
        }



        //
        // Insert/Delete Methods

        public void AddOpdracht(Opdracht opdracht)
        {
            _db.Opdrachts.InsertOnSubmit(opdracht);
        }


        public IQueryable<LeerlingOpdracht> LeerlingOpdrachtenByOpdracht(int id)
        {
            var leerlingOpdrachts = from leerlingOpdracht in FindAllLeerlingOpdrachten()
                                    where leerlingOpdracht.opdrachtID == id
                                    select leerlingOpdracht;
            return leerlingOpdrachts;
        }
        public IQueryable<LeerlingOpdrachtDetail> FindAllLeerlingOpdrachtDetails()
        {
            return _db.LeerlingOpdrachtDetails;
        }

        public void DeleteOpdracht(Opdracht opdracht)
        {

            var leerlingopdr = LeerlingOpdrachtenByOpdracht(opdracht.opdrachtID);
            foreach (var item in leerlingopdr)
            {
                _db.LeerlingOpdrachts.DeleteOnSubmit(item);
            }

            var LeerlingOpdrDets = FindAllLeerlingOpdrachtenDetailsByOpdracht(opdracht.opdrachtID);
            foreach (var item in LeerlingOpdrDets)
            {
                _db.LeerlingOpdrachtDetails.DeleteOnSubmit(item);
            }

            var Opdrachtdets = FindAllOpdrachtDetailsByOpdracht(opdracht.opdrachtID);
            foreach (var item in Opdrachtdets)
            {
                _db.OpdrachtDetails.DeleteOnSubmit(item);
            }
            _db.Opdrachts.DeleteOnSubmit(opdracht);

        }

        public void AddOpdrachtDetail(OpdrachtDetail opdrachtDetail)
        {
            _db.OpdrachtDetails.InsertOnSubmit(opdrachtDetail);
        }

        public void AddLeerling (Leerling leerling)
        {
            _db.Leerlings.InsertOnSubmit(leerling);
        }

        public void AddLeerlingOpdracht(LeerlingOpdracht leerlingOpdracht)
        {
            _db.LeerlingOpdrachts.InsertOnSubmit(leerlingOpdracht);
        }
        

	public void AddLeerlingOpdrachtDetail(LeerlingOpdrachtDetail leerlingOpdrachtDetail)
        {
            _db.LeerlingOpdrachtDetails.InsertOnSubmit(leerlingOpdrachtDetail);
        }
	
        //
        // Persistence
        
        public void Save()
        {
            _db.SubmitChanges();
        }

    }
}
